#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=305,mo=1e9+7;

int add(int x,int y){ x+=y;return x>=mo?x-mo:x;}

int n;
char s[N];
int vf[N][N];
namespace init {
	int dp[2][N][N];
	int now=0;
	void init() {
		int i,j,k;
		memset(vf,0,sizeof(vf));
		memset(dp[now],0,sizeof(dp[now]));
		dp[now][0][0]=1;
		for(i=1;i<=n;i++) {
			now^=1;
			memset(dp[now],0,sizeof(dp[now]));
			for(j=0;j<=i;j++) 
				for(k=j;k<=i;k++) {
					if(s[i]!='(') {
						if(j) dp[now][j-1][k]=add(dp[now][j-1][k],dp[now^1][j][k]);
						else vf[i][k]=add(vf[i][k],dp[now^1][j][k]);
					} 
					if(s[i]!=')') dp[now][j+1][max(j+1,k)]=
						add(dp[now][j+1][max(j+1,k)],dp[now^1][j][k]);
				}	
		}
	}	
}

namespace sub1 {
	int dp[N][N];
	int work() {
		int i,j;
		dp[0][0]=1;
		for(i=1;i<=n;i++) {
			for(j=0;j<=i;j++) {
				if(s[i]!='('&&j) dp[i][j-1]=add(dp[i][j-1],dp[i-1][j]);
				if(s[i]!=')') dp[i][j+1]=add(dp[i][j+1],dp[i-1][j]);
			}	
		}
		return dp[n][0];
	}	
}

namespace sub2 {
	int dp[N][N][2];
	int work() {
		int nv,i,j,k;
		int ans=0;
		for(nv=0;nv<=n;nv++) {
			memset(dp,0,sizeof(dp));
			dp[n][0][0]=1;
			
			for(i=n-1;i>=0;--i) {
				for(j=0;j<n-i;j++) {
					if(j>2*nv) dp[i+1][j][1]=0;
					if(j==nv) dp[i+1][j][1]=dp[i+1][j][0];
					for(k=0;k<2;k++) {
						if(s[i+1]!=')'&&j) {
							dp[i][j-1][k]=add(dp[i][j-1][k],dp[i+1][j][k]);
							//if(!k&&j-1==nv)
							//	dp[i][j-1][1]=add(dp[i][j-1][1],dp[i+1][j][k]);
						}
						if(s[i+1]!='(') {
							//if(!k||2*(j+1)<=nv) 
								dp[i][j+1][k]=add(dp[i][j+1][k],dp[i+1][j][k]);
							//if(!k&&j+1==nv) 
							//	dp[i][j+1][1]=add(dp[i][j+1][1],dp[i+1][j][k]);
						}	
					}	
				}
			}
			for(i=1;i<=n;i++) {
				for(j=0;j<=i;j++) {
					k=2*(j-nv);
					if(k<0&&k>=-n) ans=add(ans,(ll)vf[i][j]*dp[i][-k-1][(2*j-nv)<0]%mo);
				}	
			}	
		}	
		return ans;
	}	
}	

namespace sub3 {
	int dp[N][N<<1][3];
	int work(int tp) {
		int i,j,k;
		int nv;
		int ans=0;
		for(nv=0;nv<=n;nv++) {
			memset(dp,0,sizeof(dp));
			dp[n][n][0]=1;
			
			for(i=n-1;i>=0;--i) {
				for(j=i-n+1;j<n-i;j++) {
					if(j>2*nv) dp[i+1][j+n][1]=dp[i+1][j+n][2]=0;
					if(j==nv) dp[i+1][j+n][1]=dp[i+1][j+n][0];
					if(tp&&j>nv) dp[i+1][j+n][0]=dp[i+1][j+n][1]=0;
					for(k=0;k<3;k++) {
						if(s[i+1]!=')') {
							if(j>0) dp[i][j-1+n][k]=add(dp[i][j-1+n][k],dp[i+1][j+n][k]);
							else if(k) dp[i][j-1+n][2]=add(dp[i][j-1+n][2],dp[i+1][j+n][k]);
						}
						if(s[i+1]!='(') dp[i][j+1+n][k]=add(dp[i][j+1+n][k],dp[i+1][j+n][k]);
					}
				}
			}
			
			for(i=0;i<=n;i++) {
				for(j=0;j<=i;j++) {
					k=2*(j-nv);
					if(k<=n&&k>=-n) ans=add(ans,(ll)vf[i][j]*dp[i][-k-1+n][2]%mo);
				}
			}			
		}
		return ans;	
	}	
}

int main()
{
	freopen("bracket.in","r",stdin);
	freopen("bracket.out","w",stdout);
	int i,j;
	scanf("%d",&n);
	scanf("%s",s+1);
	
	int ans=sub1::work();
	
	init::init();
	ans=add(ans,sub2::work());
	ans=add(ans,sub3::work(0));
	ans=add(ans,mo-sub3::work(1));
	
	reverse(s+1,s+1+n);
	for(i=1;i<=n;i++) 
		if(s[i]=='(') s[i]=')';
		else if(s[i]==')') s[i]='(';
	init::init();
	ans=add(ans,sub2::work());
	ans=add(ans,sub3::work(0));
	
	printf("%d\n",ans);
	
	return 0;
}